#include <REGX52.H>
#include "delay.h"

sbit SCK=P3^6;//RCLK
sbit RCK=P3^5;//SRCLK
sbit SER=P3^4;//SER

#define MATRIX_LED_PORT		P0	//P0是寄存器，不能用sbit定义

/**
  * @brief  74HC595写入一个字节
  * @param  Byte 要写入的字节
  * @retval 无
  */
void _74HC595_WriteByte(unsigned char Byte)
{
	unsigned char i=0;
	for(i=0;i<8;i++)
	{
		SER=Byte&(0x80>>i);//先把最高位提取出来
		SCK=1;
		SCK=0;
	}
	RCK=1;//把8位数据送到IO口上
	RCK=0;
}

/**
  * @brief  点阵屏初始化
  * @param  无
  * @retval 无
  */
void MatrixLED_Init()
{
	SCK=0;//清零之后才会有上升沿，上升沿触发
	RCK=0;
}

/**
  * @brief  LED点阵屏显示一列数据
  * @param  Column 要选择的列，范围：0~7，0在最左边
  * @param  Data 选择列显示的数据，高位在上，1为亮，0为灭
  * @retval 无
  */
void MatrixLED_ShowColumn(unsigned char Column,Data)
{
	_74HC595_WriteByte(Data);//通过74HC595移位寄存器芯片串行输出一个字节（8位）的数据。
	//这个函数将并行数据转换为串行数据发送给74HC595，
	//然后再由74HC595将串行数据转换回并行输出，用于控制LED点阵的行数据。
	MATRIX_LED_PORT=~(0x80>>Column);//扫描的列
	Delay(1);
	//每显示完一列后必须关闭该列，才能正常显示下一列
	MATRIX_LED_PORT=0xff;//禁用所有列（消隐，防止拖影）
}
